import static java.lang.invoke.MethodHandles.lookup;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;

public class MethodHandleTest {
	static class ClassA {
		public void println(String s) {
			System.out.println("ClassA:" + s);
		}
	}

	public static void main(String[] args)throws Throwable {
		Object obj = System.currentTimeMillis() % 2 ==0 ? System.out : new ClassA();
		MethodType mt = MethodType.methodType(void.class, String.class); // 返回值 void，参数 String

		// 查找方法
		lookup()
		.findVirtual(obj.getClass(), "println", mt)
		.bindTo(obj)
		// 调用
		.invokeExact("foobar");
	}
}